package com.ruoyi.system.config;

import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.messaging.SessionConnectEvent;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
/**
 * WebSocket
 */
@Component
public class WebSocketDisconnectListener {



    /**
     * 监听客户端断开连接事件
     */
    @EventListener
    public void handleSessionDisconnect(SessionDisconnectEvent event) {
        // 获取WebSocket会话ID（唯一标识客户端连接）
        String sessionId = event.getSessionId();

        // 获取断开原因（如客户端主动关闭、超时、错误等）
        CloseStatus closeStatus = event.getCloseStatus();
        String reason = closeStatus.getReason(); // 断开原因描述
        int code = closeStatus.getCode(); // 断开状态码（如1000表示正常关闭）

        // 如果使用了用户认证，可获取用户信息（需结合Spring Security）
        // Principal principal = event.getUser();
        // String username = principal != null ? principal.getName() : "匿名用户";

        // 处理断开逻辑（如记录日志、更新在线状态等）
        System.out.println("客户端断开连接：sessionId=" + sessionId
                + "，原因：" + reason + "（状态码：" + code + "）");
    }

    //建立连接时监听
    @EventListener
    public void onSessionConnect(SessionConnectEvent event) {
        StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
        // 获取 STOMP 会话 ID
        String stompSessionId = headerAccessor.getSessionId();
        // 获取底层 WebSocket 会话 ID
//        String webSocketSessionId = headerAccessor.getSessionAttributes().get("HTTP_SESSION_ID").toString(); // 或从头部获取

        System.out.println("STOMP 连接建立，会话 ID：" + stompSessionId);
        // 可在此处将 sessionId 与用户信息（如从认证信息中获取）关联存储
    }

}
